package programa;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import pr1.bdd.Genero;
import pr1.bdd.Serie;
import pr1.bdd.Usuario;
import pr1.gui.GUIController;

public class Programa {

	private GUIController gui;
	private Usuario usuario;

	public Programa() {
		usuario = null;
		gui = new GUIController(this);
	}

	public Usuario login(String usuario, String pass) {

		if (existe(usuario)) {
			Connection con = null;
			PreparedStatement st = null;
			ResultSet rs = null;
			try {
				con = DriverManager.getConnection(
						"jdbc:mysql://localhost:3306/practica1abd",
						"AdminP1", "AdminP1");
				st = con.prepareStatement("SELECT * FROM Usuario  WHERE nick = ? and password = ? ");
				st.setString(1, usuario);
				st.setString(2, pass);
				rs = st.executeQuery();
				while (rs.next()) {
					this.usuario = new Usuario(rs.getString("nick"),
							rs.getString("password"),
							rs.getDate("fechaNacimiento"), rs.getBlob("foto"));
					this.usuario.setSigue(seriesQueSigue());
					return this.usuario;
				}
			} catch (SQLException e) {
				System.out.println(e);

			} finally {
				try {
					if (rs != null)
						rs.close();
					if (st != null)
						st.close();
					if (con != null)
						con.close();
				} catch (Exception e) {
				}
			}
			;
			return null;
		}
		return null;

	}

	private boolean existe(String nick) {
		Connection con = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		try {
			con = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/practica1abd", "AdminP1",
					"AdminP1");
			st = con.prepareStatement("SELECT * FROM Usuario WHERE nick = ? ");
			st.setString(1, nick);
			rs = st.executeQuery();
			while (rs.next()) {
				return true;
			}
		} catch (SQLException e) {
			System.out.println(e);
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (st != null)
					st.close();
				if (con != null)
					con.close();
			} catch (SQLException e) {
			}
		}
		;
		return false;
	}

	public boolean editarUsuario(Usuario u, FileInputStream fis, String nombreViejo, String fecha) {

		Connection con = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		try {
			con = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/practica1abd", "UsuarioP1",
					"UsuarioP1");
			st = con.prepareStatement("UPDATE usuario SET nick = ?, password = ?, fechaNacimiento = DATE  ?, foto = ? WHERE nick = ?");
			st.setString(1, u.getNick());
			st.setString(2, u.getPassword());
			st.setString(3, fecha);
			st.setBinaryStream(4, fis);
			st.setString(5, nombreViejo);
			st.executeUpdate();
			gui.cargarUsuario(login(u.getNick(),u.getPassword())); //para cargar los datos en la ventana principal
			
			return true;
		} catch (SQLException e) {
			e.printStackTrace();

		} finally {
			try {
				if (rs != null)
					rs.close();
				if (st != null)
					st.close();
				if (con != null)
					con.close();
			} catch (SQLException e) {
			}
		}
		;
		return false;

	}

	public Usuario nuevoUsuario(String usuario, String pass) {

		if (!existe(usuario)) {
			Connection con = null;
			PreparedStatement st = null;
			ResultSet rs = null;
			FileInputStream fis = null;
			;
			try {
				fis = new FileInputStream("src/pr1/gui/imagenes/avatar.png");
			} catch (FileNotFoundException ex) {
				System.out.println("Foto no encontradaS");
			}

			try {
				con = DriverManager.getConnection(
						"jdbc:mysql://localhost:3306/practica1abd",
						"AdminP1", "AdminP1");
				st = con.prepareStatement("INSERT INTO usuario (nick, password, fechaNacimiento, foto) VALUES (?,?,null,?)");
				st.setString(1, usuario);
				st.setString(2, pass);
				st.setBinaryStream(3, fis);
				st.executeUpdate();
				st = con.prepareStatement("SELECT * FROM Usuario WHERE nick = ? AND password = ? ");
				st.setString(1, usuario);
				st.setString(2, pass);
				rs = st.executeQuery();
				while (rs.next()) {
					this.usuario = new Usuario(rs.getString("nick"),
							rs.getString("password"), null, rs.getBlob("foto"));
					return this.usuario;
				}
			} catch (SQLException e) {
				System.out.println(e);
			} finally {
				try {
					if (rs != null)
						rs.close();
					if (st != null)
						st.close();
					if (con != null)
						con.close();
				} catch (Exception e) {
				}
			}
			;
		}
		return null;

	}

	public Serie creaSerie(String nombre, String titular, String sinopsis,
			int estreno, int fin) {
		Connection con = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		try {
			con = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/practica1abd", "AdminP1",
					"AdminP1");
			st = con.prepareStatement("INSERT INTO serie (NombreSerie, Titular, Sinopsis, Año_estreno, Año_final) VALUES (?,?,?,?,?)");
			st.setString(1, nombre);
			st.setString(2, titular);
			st.setString(3, sinopsis);
			st.setInt(4, estreno);
			st.setInt(5, fin);
			st.executeUpdate();
			return new Serie(nombre, titular, sinopsis, estreno, fin);
		} catch (SQLException e) {
			gui.alertaNoCreado();
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (st != null)
					st.close();
				if (con != null)
					con.close();
			} catch (SQLException e) {
			}
		}
		;
		return null;
	}

	public ArrayList<Serie> busquedaSeries(String string) {

		Connection con = null;
		PreparedStatement st = null;
		ResultSet rs = null;

		ArrayList<Serie> series = new ArrayList<Serie>();
		try {
			con = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/practica1abd", "UsuarioP1",
					"UsuarioP1");
			st = con.prepareStatement("SELECT * FROM serie WHERE NombreSerie like ?");
			st.setString(1, "%" + string + "%");
			rs = st.executeQuery();
			while (rs.next()) {
				series.add(new Serie(rs.getString("NombreSerie"), rs
						.getString("Titular"), rs.getString("Sinopsis"), rs
						.getInt("Año_Estreno"), rs.getInt("Año_Final")));
			}
			return series;
		} catch (SQLException e) {
			System.out.println(e);
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (st != null)
					st.close();
				if (con != null)
					con.close();
			} catch (Exception e) {
			}
		}
		return null;

	}

	public boolean insertarGeneros(ArrayList<Genero> generos) {
		Connection con = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		try {
			con = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/practica1abd", "AdminP1",
					"AdminP1");
			st = con.prepareStatement("INSERT INTO genero (NombreSerie, Genero) VALUES (?,?)");
			int i = 0;
			st.setString(1, generos.get(i).getNombreSerie());
			while (i < generos.size()) {
				st.setString(2, generos.get(i).getGenero());
				st.executeUpdate();
				i++;
			}
			return true;
		} catch (SQLException e) {
			System.out.println(e);
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (st != null)
					st.close();
				if (con != null)
					con.close();
			} catch (SQLException e) {
			}
		}
		;
		return false;

	}

	public boolean eliminarGenero(Genero genero) {
		Connection con = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		try {
			con = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/practica1abd", "AdminP1",
					"AdminP1");
			st = con.prepareStatement("DELETE FROM genero where Genero = ? AND NombreSerie = ?");
			int i = 0;
			st.setString(1, genero.getGenero());
			st.setString(2, genero.getNombreSerie());
			st.executeUpdate();

			return true;
		} catch (SQLException e) {
			System.out.println(e);
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (st != null)
					st.close();
				if (con != null)
					con.close();
			} catch (SQLException e) {
			}
		}
		;
		return false;

	}

	public Serie busquedaSerieIndividual(String string) {

		Connection con = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		try {
			con = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/practica1abd", "UsuarioP1",
					"UsuarioP1");
			st = con.prepareStatement("SELECT * FROM serie WHERE NombreSerie = ?");
			st.setString(1, string);
			rs = st.executeQuery();
			Serie serie = null;
			while (rs.next()) {
				serie = new Serie(rs.getString("NombreSerie"),
						rs.getString("Titular"), rs.getString("Sinopsis"),
						rs.getInt("Año_Estreno"), rs.getInt("Año_Final"));
			}

			// hace falta otra consulta para los géneros que tiene la serie.
			ArrayList<String> generos = new ArrayList<String>();
			st = con.prepareStatement("SELECT Genero FROM genero JOIN serie ON genero.NombreSerie = serie.NombreSerie AND genero.NombreSerie = ? ");
			st.setString(1, string);
			rs = st.executeQuery();
			while (rs.next()) {
				generos.add(rs.getString("Genero"));
			}
			serie.setGeneros(generos);

			return serie;

		} catch (SQLException e) {
			System.out.println(e);
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (st != null)
					st.close();
				if (con != null)
					con.close();
			} catch (Exception e) {
			}
		}
		return null;

	}

	public boolean sigueSerie(Serie serie) {
		this.usuario.getSigue().add(serie);
		Connection con = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		try {
			con = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/practica1abd", "UsuarioP1",
					"UsuarioP1");
			st = con.prepareStatement("INSERT INTO sigue (Nick,NombreSerie) VALUES (?,?)");
			st.setString(1, this.usuario.getNick());
			st.setString(2, serie.getNombreSerie());
			st.executeUpdate();

			return true;
		} catch (SQLException e) {
			System.out.println(e);
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (st != null)
					st.close();
				if (con != null)
					con.close();
			} catch (SQLException e) {
			}
		}
		;
		return false;
	}

	public ArrayList<Serie> seriesQueSigue() {
		Connection con = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		ArrayList<Serie> sigue = new ArrayList<Serie>();
		try {
			con = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/practica1abd", "UsuarioP1",
					"UsuarioP1");
			st = con.prepareStatement("SELECT * FROM serie JOIN sigue ON serie.NombreSerie = sigue.NombreSerie AND Nick = ?");
			st.setString(1, this.usuario.getNick());
			rs = st.executeQuery();
			Serie serie = null;
			while (rs.next()) {
				sigue.add(new Serie(rs.getString("NombreSerie"), rs
						.getString("Titular"), rs.getString("Sinopsis"), rs
						.getInt("Año_Estreno"), rs.getInt("Año_Final")));
			}

			return sigue;

		} catch (SQLException e) {
			System.out.println(e);
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (st != null)
					st.close();
				if (con != null)
					con.close();
			} catch (Exception e) {
			}
		}
		return null;

	}

	public boolean dejaSeguirSerie(Serie serie) {

		Connection con = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		try {
			con = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/practica1abd", "UsuarioP1",
					"UsuarioP1");
			st = con.prepareStatement("DELETE FROM sigue WHERE NombreSerie = ? ");
			st.setString(1, serie.getNombreSerie());
			st.executeUpdate();

			return true;

		} catch (SQLException e) {
			System.out.println(e);
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (st != null)
					st.close();
				if (con != null)
					con.close();
			} catch (SQLException e) {
			}
		}
		;
		return false;

	}

	public boolean editarSerie(Serie serie, String nombreViejo) {
		Connection con = null;
		PreparedStatement st = null;
		ResultSet rs = null;
		try {
			con = DriverManager.getConnection(
					"jdbc:mysql://localhost:3306/practica1abd", "AdminP1",
					"AdminP1");
			st = con.prepareStatement("UPDATE serie SET NombreSerie = ? , Titular = ?, Sinopsis = ?,Año_Estreno = ?, Año_Final = ? WHERE NombreSerie = ?");
			st.setString(1, serie.getNombreSerie());
			st.setString(2, serie.getTitular());
			st.setString(3, serie.getSinopsis());
			st.setInt(4, serie.getAno_estreno());
			st.setInt(5, serie.getAno_final());
			st.setString(6, nombreViejo);
			st.executeUpdate();
			return true;
		} catch (SQLException e) {
			System.out.println(e);
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (st != null)
					st.close();
				if (con != null)
					con.close();
			} catch (SQLException e) {
			}
		}
		;
		return false;

	}
}
